OSErr AEPrintDocument ( const AppleEvent *inputEvent,
AppleEvent *outputEvent,
SInt32 handlerRefCon )
{
#pragma unused (outputEvent,handlerRefCon)
assert( inputEvent != NULL );
OSStatus status = noErr;
PMPrintSettings printSettings = kPMNoPrintSettings;
PMPrinter printer = NULL;
Boolean showPrintDialog = false;
PMPrintSession session = NULL;
PMPageFormat pageFormat = kPMNoPageFormat;
Boolean printIt = true;
#define kDontCare NULL
// 次のセクションで、受け取ったアップルイベントからパラメータを取り出す。
// すべてが省略可能なので、ステータスは無視する。
// つまり、データがなければそのまま次の進む。
// プリント設定を取得する。
// プリント設定が指定されていない場合もある。
// その場合には、後でデフォルトのプリント設定を使用する。
status = AEGetParamPtr( inputEvent,
keyAEPropData, kPMPrintSettingsAEType,
kDontCare, &printSettings,
sizeof( void* ), kDontCare );
// プリンタが指定されていれば、それを取得する。
// ターゲットプリンタが指定されていない場合もある。
status = AEGetParamPtr( inputEvent,
keyAEPropData, kPMPrinterAEType,
kDontCare, &printer, sizeof( void* ),
kDontCare );
// プリントダイアログを表示するべきかどうかを調べる。デフォルトでは表示しない。
status = AEGetParamPtr( inputEvent,
kPMShowPrintDialogAEType, typeBoolean,
kDontCare, &showPrintDialog,
sizeof( Boolean ), kDontCare );
// イベントから PMPrintSettings、PMPrinter、および showPrintDialog の
// 各項目を取得したので、ファイルをプリントする。
// プリントを実行するためのセッションを作成する。
status = PMCreateSession( &session );
if ( status == noErr )
{
// ターゲットプリンタを出力先として設定する
if ( printer != NULL )
{
status = PMSessionSetCurrentPMPrinter( session, printer);
}
// スクリプト作成者が特定のプリント設定を要求していなければ、
// デフォルトの設定をロードする。
if ( printSettings == kPMNoPrintSettings )
{
status = PMCreatePrintSettings( &printSettings );
if ( status == noErr )
{
status = PMSessionDefaultPrintSettings(session,
printSettings);
}
}
// デフォルトの PMPageFormat を作成する。
// 実際のアプリケーションでは、書類とともに格納されているページ設定を
// 展開し、それを使用する。
status = PMCreatePageFormat(&pageFormat);
if ( (status == noErr) && (pageFormat != kPMNoPageFormat) )
{
PMSessionDefaultPageFormat(session, pageFormat);
}
// プリントダイアログを表示するかどうかを調べる。
// プリントダイアログは、1 つの pdoc イベントに対して一度だけ表示する。
// その結果取得した設定をイベントのすべてのファイルに使用する。
if ( showPrintDialog )
{
status = PMSessionPrintDialog( session, printSettings,
pageFormat, &printIt );
}
if ( printIt )
{
AEDescList docList;
long index, itemsInList;
// ファイルのリストを取得する
status = AEGetParamDesc( inputEvent, keyDirectObject,
typeAEList, &docList );
if ( status == noErr )
{
// プリントするファイルの数を取得する
status = AECountItems( &docList, &itemsInList );
// ファイルのリストを反復処理する
for ( index = 1; index <= itemsInList; index++ )
{
AEKeyword keywd;
DescType returnedType;
Size actualSize;
HFSUniStr255 fileName;
CFStringRef fileNameRef=NULL;
WindowRef windowRef = NULL;
char buffer[ kFileBufferSize ];
long count = sizeof( buffer );
FSRef fileRef;
// ファイル参照を取得する
status = AEGetNthPtr( &docList, index, typeFSRef,
&keywd, &returnedType,
(Ptr)(&fileRef),
sizeof( fileRef ),
&actualSize );
// ウィンドウのタイトルに使用するファイル名を取得する
if ( status == noErr )
{
status = FSGetCatalogInfo( &fileRef, 0, NULL,
&fileName,
NULL, NULL );
}
if ( status == noErr )
{
fileNameRef = CFStringCreateWithCharacters(
kCFAllocatorDefault,
&fileName.unicode[0],
fileName.length );
}
// ファイルを読み取りのために開く
if ( status == noErr )
{
status = ReadFileData( fileRef, &count,
&buffer[0] );
if ( status == noErr )
{
// 書類ウィンドウのサンプルを表示する
windowRef = ShowDocumentWindow(
fileNameRef,buffer,count);
status = PrintDocument( session,
printSettings, pageFormat,
fileNameRef, buffer );
// ファイル名文字列は用済み
CFRelease( fileNameRef );
// ウィンドウは用済み
DisposeWindow( windowRef );
}
}
}
}
}
// 後始末
PMRelease( pageFormat );
PMRelease( session );
}
// 完了したのですべて解放する
PMRelease( printSettings );
PMRelease( printer );
return status;
} // AEPrintDocument
|